package netty.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 服务端的ChannelHandler，实现了服务端从客户端接收到请求的业务逻辑处理，也就是我们的业务代码部分
 */
@ChannelHandler.Sharable// 该注解表明，该ChannelHandler可以被多个Channel安全的共享使用
public class ServerHandler extends ChannelInboundHandlerAdapter {

    private static final Logger log = LoggerFactory.getLogger(ServerHandler.class.getSimpleName());

    /**
     * 有客户端的请求消息时调用
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf msgByte = (ByteBuf) msg;
        log.info("Received:" + msgByte.toString(CharsetUtil.UTF_8));
    }

    /**
     * 请求消息读取完成时调用
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // 返回客户端一个空串作为响应，并关闭channel
        log.info("读取完成");
        ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
                .addListener(ChannelFutureListener.CLOSE);
    }

    /**
     * 发生异常时调用
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
